package com.cskaoyan.javase.oop3._2inner._6lambda._2notice;

/**
 * Lambda表达式的注意事项:
 *      1.Lambda表达式是特殊的局部内部类，所以它访问方法的局部变量，该变量必须是final的（实际常量）。
 *      2.Lambda表达式的大括号是重写父接口的抽象方法的重写方法体
 *          和装有Lambda表达式的作用域
 *          共用一个作用域的
 *          Lambda表达式没有自身独立的作用域
 *      3.方法引用
 *          Lambda表达式的 方法引用可以指向自己手写的一个实现方法
 *          也可以指向任何一个已存在的方法
 *              比如JDK源码中的方法
 *              比如三方工具包中的方法
 *
 * @since 11:01
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 如果在Lambda表达式中访问局部变量a,那么a是一个常量
        int a = 10;
        IA ia = () -> {
            // Variable 'a' is already defined in the scope
            // int a =20;
            System.out.println("hello world!");
            System.out.println(a);
            // a = 100;
        };

        // Lambda指向println方法
        // IA可以把无参的println方法作为抽象方法实现
        IA ia2 = System.out::println;
        ia2.test();
        System.out.println("hello world!");

        IB ib = System.out::println;
        ib.test("666666");
    }
}

interface IA {
    void test();
}
interface IB{
    void test(String str);
}